package rpg.data
{

	import flash.utils.Dictionary;

	import rpg.manager.DataManager;

	public class Spell extends GameData
	{
		public var spellType : int;
		public var icon : int;
		public var level : int;
		public var maxExperience : int;
		public var requiredLevel : int;
		public var manaCost : int;
		/**
		 * 自CD
		 */
		public var selfCoolTime : int;
		/**
		 * 公共CD
		 */
		public var globalCoolTime : int;
		public var releaseRange : int;
		public var description : String;

		public var xExtHurtRange : int;
		public var yExtHurtRange : int;
		public var releaseType : int;
		public var upgradeSoul : Vector.<int>;

		public var parentSpell : Vector.<int>;

		public var soulCost : Vector.<int>;
		public static const TARGET_TYPE_ENEMY_MONSTER : int = 0;
		public static const TARGET_TYPE_ENEMY_PLAYER : int = 1;
		public static const TARGET_TYPE_ENEMY_ALL : int = 2;
		public static const TARGET_TYPE_SELF : int = 3;
		public static const TARGET_TYPE_SELF_MONSTER : int = 4;
		public static const TARGET_TYPE_SELF_PLAYER : int = 5;
		public static const TARGET_TYPE_SELF_ALL : int = 6;
		public static var nextReleaseTime : Number;
		public static var spellMaxCount : Vector.<int> = Vector.<int>([0 , 1]);
		private static var globalSpellList : Array;
		/**
		 * 普通伤害类型
		 */
		public static const SPELL_TYPE_DAMAGE : int = 1;
		/**
		 * 目标状态类型
		 */
		public static const SPELL_TYPE_TARGETSTATE : int = 2;
		/**
		 * 场景特效
		 */
		public static const SPELL_TYPE_SCENEEFFECT : int = 3;
		/**
		 * 空间技能
		 */
		public static const SPELL_TYPE_SPACESPELL : int = 4;
		public var isSoulSpell : int;
		public var extHurtRangeFilled : int;
		public var learnSpellType : int;
		public var nextLevelSpellID : int;
		public var startCoolTime : Number;
		public var coolLastTime : int;
		public var coolPercent : int;
		public var upgradeGoodsId : int;
		public var upgradeExp : int;

		//oyzm
		/**
		 *
		 * 施法动作名称，对应本地资源名称
		 */
		public var actionName : String = "";

		/**
		 * 释放技能后的硬直时间，不可移动
		 */
		public var hardTime : int = 0;

		/**
		 * 技能动画
		 */
		public var animation : String

		/**
		 * 施法动画  加在施法者身上
		 */
		public var selfAnimation : String = "";

		/**
		 * 爆点动画，加在目标身上
		 */
		public var targetAnimation : String = '';

		/**
		 * 飞行特效动画
		 */
		public var flyerAnimation : String = '';

		//没用的变量 , flyerAnimation替代这个功能
		public var flyerType : int;
		/**
		 * 动作播放帧时间
		 */
		public var actionSpeed : int;
		/**
		 * 	弹道飞行速度 像素/s
		 */
		public var flightSpeed : int;

		/**
		 * 需要种族
		 */
		public var requiredRace : int;

		/**
		 * 需要金钱
		 */
		public var requiredMoney : int;

		/**
		 * 振屏
		 */
		public var shake : int;

		/**
		 *  生效时间 ，比如要在什么时候开始算技能生效
		 */
		public var delayTime : int;

		/**
		 *  是否允许自动释放
		 */
		public var isAutoReleasable : int;

		/**
		 * 是否为伤害技能
		 */
		public var isDamage : Boolean = true;

		/**
		 * 攻击威力值
		 */
		public var attachedDamage : int;

		/**
		 * 伤害增幅
		 */
		public var damageMultiple : int;

		/**
		 *  0 表示不是怒气技能, 大于0表示所需要消耗的怒气量 oyzm 2011 04 15
		 */
		public var rageCost : int;

		//oyzm
		/**
		 * 游戏中所有的主动技能，切换场景不用清除
		 */
		public static var globalSpells : Dictionary = new Dictionary();

		//gssbyp
		/**
		 * 可升级
		 */
		public var upgradeable : Boolean = false;

		/**
		 * 可学习
		 */
		public var learnable : Boolean = false;

		/**
		 * 学习过
		 */
		public var isLearned : Boolean = false;

		/**
		 *前置技能id
		 */
		public var prerequisite : int;
		/**
		 *技能位置
		 */
		public var panelPosition : String;

		/**
		 * 是否冲锋技能
		 */
		public var isRushSpell : Boolean;

		/**
		 * 闪烁类型 (0:不闪烁, 1:只能对自己人, 2:只能对敌方, 3:可对所有人, 1/2/3仅在xHurtRange=0时有效, xHurtRange>0时为不选择目标,选择场景中的一点)
		 */
		public var blinkType : int;

		/**
		 * 击退格数
		 */
		public var beatBackDistance : int;

		public var selfStates : int;
		public var targetStates : int;

		public function Spell()
		{
			isSoulSpell = 1;
			releaseRange = 5;
			selfCoolTime = 1000;
			globalCoolTime = 500;
			coolPercent = 24;
			upgradeSoul = new Vector.<int>();
			parentSpell = new Vector.<int>();
			soulCost = new Vector.<int>();
			isDamage = true;
		}

		/**
		 * 是否为怒气技
		 * @return
		 */
		public function isRageSpell() : Boolean
		{
			return rageCost > 0;
		}

		/**
		 * 是否是闪烁技能
		 * @return
		 */
		public function get isBlink() : Boolean
		{
			return blinkType > 0;
		}

		public function getSelfSpellAnimation() : SpellAnimation
		{
			return getSpellAnimation(selfAnimation);
		}

		public function getAnimationSpellAnimation() : SpellAnimation
		{
			return getSpellAnimation(animation);
		}

		public function getTargetSpellAnimation() : SpellAnimation
		{
			return getSpellAnimation(targetAnimation);
		}

		public function getFlySpellAnimation() : SpellAnimation
		{
			return getSpellAnimation(flyerAnimation);
		}

		public function getSpellAnimation(spellAnimationName : String) : SpellAnimation
		{
			return DataManager.getInstance().spellsAnimation[spellAnimationName];
		}

	}
}